﻿using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
using Force.DeepCloner;
using Mapster;
using Moq.AutoMock;
using System.ComponentModel;

namespace 克隆Test
{

    //原文 https://www.cnblogs.com/hippieZhou/p/15590457.html

    //mean 平均值
    //mean 列为我们提供了相应方法的所有测量值的平均值（或算术平均值）。在上面的例子中，webrequest 需要 329.3 毫秒，restrequest 需要 373.3 毫秒，（ms 表示毫秒）

    //error
    //误差列是指 99.9% 置信区间的一半。换句话说，我们可以 99.9% 确定实际平均值在采样平均值的 6.73 毫秒和 7.42 毫秒之间。

    //stddev 标准误差
    //标准差 （StdDev） 列告诉我们执行与平均值的差异程度。较小的标准差通常意味着样本均值可以很好地表示实际均值。因为我们面对的是纳秒级的世界，所以我们当然可以信任这些结果。
    internal class Program
    {
        static void Main(string[] args)
        {
            //var mocker = new AutoMocker();
            //var _clones = Enumerable.Range(0, 1000000).Select(x => mocker.CreateInstance<EntityClone>()).ToList();
            var summary = BenchmarkRunner.Run<PerformanceTest>(); //需要在release下运行

            Console.ReadKey();
        }
    }

    public class PerformanceTest
    {
        private List<EntityClone> _clones;

        public PerformanceTest()
        {
            var mocker = new AutoMocker();
            _clones = Enumerable.Range(0, 10).Select(x => mocker.CreateInstance<EntityClone>()).ToList();
        }

        [Benchmark]
        public void Mapster()
        {
            var dtos = _clones.Adapt<List<EntityClone>>();
        }


        [Benchmark]
        public void DeepCloner()
        {
            var dtos = _clones.DeepClone();

        }
    }

    public enum MyEnum
    {
        [Description("进行中")]
        Doing,
        [Description("完成")]
        Done
    }
    public class EntityClone
    {
        public int Id { get; set; } = 1;
        public Guid Oid { get; set; } = Guid.NewGuid();
        public string? NickName { get; set; } = new Random().Next(0, 99999).ToString();
        public bool Created { get; set; } = true;
        public MyEnum State { get; set; }

        public EntityClone2? Dto2 { get; set; } = new EntityClone2();
    }
    public class EntityClone2
    {
        public int Id { get; set; } = 1;
        public Guid Oid { get; set; } = Guid.NewGuid();
        public string? NickName { get; set; } = new Random().Next(0, 99999).ToString();
        public bool Created { get; set; }
        public MyEnum Enum { get; set; }
        public string? EnumString { get; set; }
    }
}
